home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
mint
/
mint104s.zoo
/
mint.src
/
mem.h
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-08
|
6KB
|
206 lines
/*
Copyright 1990,1991,1992 Eric R. Smith.
Copyright 1992 Atari Corporation.
All rights reserved.
*/
#ifndef _mem_h
#define _mem_h
#include "file.h"
typedef struct memregion {
long loc; /* base of memory region */
ulong len; /* length of memory region */
ushort links; /* number of users of region */
ushort mflags; /* e.g. which map this came from */
struct memregion *next; /* next region in memory map */
} MEMREGION;
/* dummy type for virtual addresses */
typedef struct vaddr {
char dummy;
} *virtaddr;
/*
* Here's the deal with memory bits:
*
* Mxalloc(long size, int mode) takes these fields in 'mode': BITS 0-2 hold
* values 0-3 for the old GEMDOS mode argument. If bit 3 is on, then only
* F_PROTMODE (bits 4-7) counts, and it encodes the desired protection mode
* to change a block to. Else F_PROTMODE is the desired protection mode for
* the new block you're allocating. In either case, F_PROTMODE turns into
* a PROT_* thusly: if it's zero, you get the F_PROTMODE value from curproc's
* prgflags. Else you get (F_PROTMODE >> F_PROTSHIFT)-1.
*
* The 0x4000 bit is carried along into get_region (but not from there into
* mark_region) and, if set, causes M_KEEP to be set in the region's
* mflags.
*/
/* flags for memory regions */
#define M_CORE 0x01 /* region came from core map */
#define M_ALT 0x02 /* region came from alt map */
#define M_SWAP 0x04 /* region came from swap map */
#define M_KER 0x08 /* region came from kernel map */
#define M_MAP 0x0f /* and with this to pick out map */
#define M_SHTEXT 0x10 /* region is a shared text region */
#define M_KEEP 0x0100 /* don't free on process termination */
/* structure for shared text regions */
typedef struct shtextreg {
FILEPTR *f; /* what file did this come from? */
MEMREGION *text; /* pointer to shared text region */
short mtime, mdate; /* date & time for file */
struct shtextreg *next;
} SHTEXT;
/* structure of exectuable program headers */
typedef struct fileheader {
short fmagic;
long ftext;
long fdata;
long fbss;
long fsym;
long reserved;
long flag;
short reloc;
} FILEHEAD;
#define GEMDOS_MAGIC 0x601a
/* flags for curproc->memflags */
/* also used for program headers PRGFLAGS */
#define F_FASTLOAD 0x01 /* don't zero heap */
#define F_ALTLOAD 0x02 /* OK to load in alternate ram */
#define F_ALTALLOC 0x04 /* OK to malloc from alt. ram */
#define F_RESERVED 0x08 /* reserved for future use */
#define F_MEMFLAGS 0xf0 /* reserved for future use */
#define F_SHTEXT 0x800 /* program's text may be shared */
#define F_MINALT 0xf0000000L /* used to decide which type of RAM to load in */
/* Bit in Mxalloc's arg for "don't auto-free this memory" */
#define F_KEEP 0x4000
#define F_OS_SPECIAL 0x8000 /* mark as a special process */
/* flags for curproc->memflags (that is, PRGFLAGS) and also Mxalloc mode. */
/* (Actually, when users call Mxalloc, they add 0x10 to what you see here) */
#define F_PROTMODE 0xf0 /* protection mode bits */
#define F_PROT_P 0x00 /* no read or write */
#define F_PROT_G 0x10 /* any access OK */
#define F_PROT_S 0x20 /* any super access OK */
#define F_PROT_PR 0x30 /* any read OK, no write */
#define F_PROT_I 0x40 /* invalid page */
/* actual values found in page_mode_table and used as args to alloc_region */
#define PROT_P 0
#define PROT_G 1
#define PROT_S 2
#define PROT_PR 3
#define PROT_I 4
#define PROT_PROTMODE 0xf /* these bits are the prot mode */
#define PROT_NOCHANGE -1
#define F_PROTSHIFT 4
typedef MEMREGION **MMAP;
#ifndef GENMAGIC
extern MMAP core, alt, ker, swap;
#endif
/* compilers differ on what "sizeof" returns */
#define SIZEOF (long)sizeof
/* QUANTUM: the page size for the mmu: 8K. This is hard-coded elsewhere. */
#define QUANTUM 0x2000L
/* MiNT leaves this much memory for TOS to use (8K)
*/
#define TOS_MEM (QUANTUM)
/* MiNT tries to keep this much memory available for the kernel and other
* programs when a program is launched (8K)
*/
#define KEEP_MEM (QUANTUM)
/*
* how much memory should be allocated to the kernel? (24K)
*/
#define KERNEL_MEM (3*QUANTUM)
/* macro for rounding off region sizes to QUANTUM (page) boundaries */
/* there is code in mem.c that assumes it's OK to put the screen
* in any region, so this should be at least 256 for STs (16 is OK for
* STes, TTs, and Falcons). We actually set a variable in main.c
* that holds the screen boundary stuff.
*/
extern int no_mem_prot;
extern int screen_boundary;
#define MASKBITS (no_mem_prot ? screen_boundary : (QUANTUM-1))
#define ROUND(size) ((size + MASKBITS) & ~MASKBITS)
/* interesting memory constants */
#define EIGHT_K (0x400L*8L)
#define ONE_MEG 0x00100000L
#define LOG2_ONE_MEG 20
#define LOG2_16_MEG 24
#define LOG2_EIGHT_K 13
#define SIXTEEN_MEG (0x400L*0x400L*16L)
/* macro for turning a curproc->base_table pointer into a 16-byte boundary */
#define ROUND16(ld) ((long_desc *)(((ulong)(ld) + 15) & ~15))
/* TBL_SIZE is the size in entries of the A, B, and C level tables */
#define TBL_SIZE (16)
#define TBL_SIZE_BYTES (TBL_SIZE * sizeof(long_desc))
typedef struct {
short limit;
unsigned zeros:14;
unsigned dt:2;
struct long_desc *tbl_address;
} crp_reg;
/* format of long descriptors, both page descriptors and table descriptors */
typedef struct {
unsigned limit; /* set to $7fff to disable */
unsigned unused1:6;
unsigned unused2:1;
unsigned s:1; /* 1 grants supervisor access only */
unsigned unused3:1;
unsigned ci:1; /* cache inhibit: used in page desc only */
unsigned unused4:1;
unsigned m:1; /* modified: used in page desc only */
unsigned u:1; /* accessed */
unsigned wp:1; /* write-protected */
unsigned dt:2; /* type */
} page_type;
typedef struct long_desc {
page_type page_type;
struct long_desc *tbl_address;
} long_desc;
typedef struct {
unsigned enable:1;
unsigned zeros:5;
unsigned sre:1;
unsigned fcl:1;
unsigned ps:4;
unsigned is:4;
unsigned tia:4;
unsigned tib:4;
unsigned tic:4;
unsigned tid:4;
} tc_reg;
#endif /* _mem_h */